package myjava.p_classLoader;

/**
 * @Auther: cty
 * @Date: 2020/4/14 18:32
 * @Description: 测试初始化
 * 类加载全过程
 * 1 Java源代码到在JVM中运行的过程
 *      （1）编写Java源代码
 *      （2）源代码 编译（javac） 生成字节码文件
 *      （3）字节码文件 加载到内存中并在JVM中运行
 *              加载（使用类加载器）
 *              链接（包括验证、准备和解析）
 *              初始化（执行类构造器，和类的构造器不同）
 *
 * @version: 1.0
 */
public class Demo01 {
    static{
        System.out.println("静态初始化Demo01");
    }

    public static void main(String[] args) throws Exception {
        System.out.println("Demo01的main方法！");
        System.out.println(System.getProperty("java.class.path"));

        //主动引用（一定会发生类的初始化）
//		new A();  // 1 new一个类对象时
//		System.out.println(A.width);  // 2 调用类的静态成员(除了final常量)和静态方法
//		Class.forName("com.cty.test.A");  //3 使用java.lang.reflect包的方法对类进行反射调用
        // 4 当虚拟机启动，java Hello，则一定会初始化Hello类。说白了就是先启动main方法所在的类
        // 5 当初始化一个类，如果其父类没有被初始化，则先会初始化他的父类


        //被动引用(不会发生类的初始化)
//		System.out.println(A.MAX);  // 1 引用常量不会触发此类的初始化（常量在编译阶段就存入调用类的常量池中了）
//		A[] as = new A[10];  //2 通过数组定义类引用，不会触发此类的初始化
        System.out.println(A_Child.width);  //3 当访问一个静态域时，只有真正声明这个域的类才会被初始化。如通过子类引用父类的静态变量，不会导致子类初始化，只会初始化父类

    }
}

class A_Child  extends A {
    static {
        System.out.println("静态初始化A_Child");
    }
}

class A extends A_Father {
    public static int width = 100;   //静态变量，静态域    field
    public static final  int MAX = 100;

    static {
        System.out.println("静态初始化类A");
        width=300;
    }
    public A(){
        System.out.println("创建A类的对象");
    }
}

class A_Father extends Object {
    static {
        System.out.println("静态初始化A_Father");
    }
}

